home *** CD-ROM | disk | FTP | other *** search
/ PCMania 39 / PCMania CD39_2.iso / pcmania / virus39 / antigal.c next >
C/C++ Source or Header  |  1995-08-22  |  15KB  |  433 lines

  1. /*----------------------------------------------*/
  2. /* ANTIGAL (c) 1995 Por Javier Guerrero Díaz 
  3. /* Busca en la memoria, boot de disketes 
  4. /* y MBR del disco duro el virus GALICIA.
  5. /* La sintaxis es: ANTIGAL <unidad>.
  6. /* Programado con Borland C++ 4.5
  7. /*----------------------------------------------*/
  8. /*      Javier Guerrero Díaz     */
  9. /*   C/ Emilio Santacana, nº 5   */
  10. /*      11201 - ALGECIRAS        */
  11. /*          (CADIZ)              */
  12. /*-------------------------------*/
  13.  
  14. #include <stdio.h>
  15. #include <dos.h>
  16. #include <dir.h>
  17. #include <conio.h>
  18. #include <bios.h>
  19. #include <stdlib.h>
  20. #include <direct.h>
  21. #include <string.h>
  22.  
  23. void intro(void);
  24. void buscamem(void);
  25. void busca(void);
  26. void leeboot(void);
  27. void errorhand(int);
  28. void buscaenboot(void);
  29. void mensaje(char *mensa);
  30. void matavir(void);
  31. void panta(void);
  32. void fin(void);
  33. void mal(void);
  34.  
  35. int far *direcc;
  36. char far *memo;
  37. char tecla,flag,unidad,cambio,buffer[512],letra;
  38. char cadena[]={ 0x0E,0x1F,0xBB,0x3C,0x7C,0x8B,0x07,0x35,0xFF,0xFF,0x89,0x07,
  39.         0x43,0x43,0x81,0xFB };
  40. int segmento,despl,pulsa,temp;
  41.  
  42. void main(argc,argv)
  43. int argc;
  44. char *argv[];
  45. {
  46. letra=*argv[1];
  47. if (*argv[1]=='a' || *argv[1]=='A') unidad=0;
  48. else if (*argv[1]=='b' || *argv[1]=='B') unidad=1;
  49. else if (*argv[1]=='c' || *argv[1]=='C') unidad=0x80;
  50. else if (*argv[1]=='d' || *argv[1]=='D') unidad=0x81;
  51.  
  52. else {  printf("\nANTIGAL (c)1995 Por Javier Guerrero Díaz\n");
  53.     printf("Sintaxis: ANTIGAL <unidad>\n"); exit(-1); }
  54.  
  55. setcbrk(1);
  56. _setcursortype(_NOCURSOR);
  57.  
  58. intro();
  59. panta();
  60. buscamem();
  61. leeboot();
  62. buscaenboot();
  63. }
  64.  
  65. void matavir(void)
  66. {
  67. short resultado1;
  68. int resultado2;
  69. char head,sector;
  70.  
  71. segmento=FP_SEG(buffer); despl=FP_OFF(buffer); 
  72. if (unidad==0 || unidad==1) { sector=3; head=1; }
  73. else { sector=6; head=0; }
  74.  
  75. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  76. cprintf("                                                  ");
  77. gotoxy(24,23); cprintf("Leyendo boot original ..."); sleep(1);
  78. gotoxy(24,23);
  79. cprintf("                                                  ");                 
  80.  
  81. asm     mov     ah,0
  82. asm     mov     dl,byte ptr unidad
  83. asm     int     13h
  84. resultado1=_AH;
  85.     if (resultado1 !=0) errorhand(resultado1);
  86.  
  87. asm    mov    ah,15h
  88. asm    mov    dl,byte ptr unidad
  89. asm    int    13h
  90. asm    mov    byte ptr cambio,ah
  91.  
  92. asm     mov     ah,2
  93. asm     mov     dl,byte ptr unidad
  94. asm     mov     dh,byte ptr head
  95. asm     mov     ch,0
  96. asm     mov     cl,byte ptr sector
  97. asm     mov     al,1
  98. asm     mov     es,segmento
  99. asm     mov     bx,despl
  100. asm     int     13h
  101. asm     mov     resultado2,ax
  102.     if (unidad==0 && resultado2 !=0x0001) 
  103.         errorhand(resultado2);
  104.     else if (unidad==1 && resultado2 !=0x0001)
  105.         errorhand(resultado2);
  106.     else if (unidad==0x80 && resultado2!=0) 
  107.         errorhand(resultado2);
  108.     else if (unidad==0x81 && resultado2!=0)
  109.         errorhand(resultado2);
  110.  
  111. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  112. cprintf("                                                  ");
  113. gotoxy(24,23); cprintf("Restaurando boot original ..."); sleep(1);
  114. gotoxy(24,23);
  115. cprintf("                                                  ");                 
  116.  
  117. asm     mov     ah,3
  118. asm     mov     dl,byte ptr unidad
  119. asm     mov     dh,0
  120. asm     mov     ch,0
  121. asm     mov     cl,1
  122. asm     mov     al,1
  123. asm     mov     es,segmento
  124. asm     mov     bx,despl
  125. asm     int     13h
  126. asm     mov     resultado2,ax
  127.     if (unidad==0 && resultado2 !=0x0001) 
  128.         errorhand(resultado2);
  129.     else if (unidad==1 && resultado2 !=0x0001)
  130.         errorhand(resultado2);
  131.     else if (unidad==0x80 && resultado2!=0) 
  132.         errorhand(resultado2);
  133.     else if (unidad==0x81 && resultado2!=0)
  134.         errorhand(resultado2);
  135.  
  136. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  137. cprintf("                                                  ");
  138. gotoxy(24,23); cprintf("OK. Virus GALICIA eliminado."); sleep(1);
  139. gotoxy(24,23);
  140. cprintf("                                                  ");
  141. }
  142.  
  143. void buscaenboot(void)
  144. {
  145. direcc=&buffer[0x01B3];
  146. if (*direcc==0x3156)
  147.        {
  148.          window(17,7,63,15); textattr(YELLOW|RED<<4); putch(7);
  149.          cprintf("╔═════════════════════════════════════════════╗");
  150.          cprintf("║   Atención: Encontrada marca de infección   ║");
  151.          cprintf("║ del virus GALICIA en el sector de arranque  ║");
  152.          cprintf("║   de la unidad %c: . Para mayor seguridad,   ║",letra);
  153.          cprintf("║   ANTIGAL analizará el código en busca de   ║");
  154.          cprintf("║     la rutina de encriptado propia del      ║");
  155.          cprintf("║               virus GALICIA.                ║");
  156.          cprintf("╚═════════════════════════════════════════════╝");
  157.      mensaje("Encontrada marca de infección del virus."); sleep(5);       
  158.      memo=&buffer[0x27];
  159.          for (temp=0;temp<sizeof cadena;temp++)
  160.                 {
  161.                  if (*memo!=cadena[temp]) goto noinfec;
  162.                  else memo++;
  163.                 }
  164.      window(17,7,63,15); textattr(WHITE|RED<<4); putch(7);
  165.          cprintf("╔═════════════════════════════════════════════╗");
  166.          cprintf("║ Atención: Encontrada rutina de encriptación ║");
  167.          cprintf("║ propia del virus GALICIA, en el boot sector ║");
  168.          cprintf("║               de la unidad %c: .             ║",letra);
  169.          cprintf("║    Esta unidad se encuentra infectada por   ║");
  170.          cprintf("║    el virus. Pulse 'SUPR' para eliminarlo   ║");
  171.          cprintf("║ o cualquier tecla para analizar otro disco. ║");
  172.          cprintf("╚═════════════════════════════════════════════╝");
  173.          mensaje("¡ Sector de arranque infectado !");
  174.      pulsa=bioskey(0);
  175.                 switch (pulsa)
  176.                 {
  177.                         case 283:       fin();
  178.                                         break;
  179.                         case 0x5300:    matavir();
  180.                                         goto tecl;
  181.              default:    goto tecl;
  182.                 }
  183. noinfec: window(17,7,63,19);
  184.          cprintf("╔═════════════════════════════════════════════╗");
  185.          cprintf("║   Aviso: No se ha encontrado la rutina de   ║");
  186.          cprintf("║ encriptado del virus GALICIA. Puede ser una ║");
  187.          cprintf("║  falsa alarma o bien puede tratarse de una  ║");
  188.          cprintf("║    variante del virus cuya rutina de en-    ║");
  189.          cprintf("║  criptado sea diferente. En cualquier caso  ║");
  190.          cprintf("║ este sector de arranque es dudoso; es reco- ║");
  191.          cprintf("║ mendable limpiarlo, a menos que se tenga la ║");
  192.          cprintf("║ seguridad de que el disco no está infectado.║");
  193.          cprintf("║                                             ║");
  194.          cprintf("║  Pulse una tecla para analizar otro disco.  ║");
  195.          cprintf("╚═════════════════════════════════════════════╝");
  196.      mensaje("Falsa alarma o variante del virus.");
  197.        }
  198. else   { window(17,7,63,15); textattr(WHITE|CYAN<<4);
  199.          cprintf("╔═════════════════════════════════════════════╗");
  200.          cprintf("║  OK! El sector de arranque de la unidad %c:  ║",letra);
  201.          cprintf("║ no contiene la marca de infección del virus ║");
  202.          cprintf("║      GALICIA. Esta unidad está limpia.      ║");  
  203.          cprintf("║  Pulse una tecla para comprobar otro disco  ║");
  204.          cprintf("║  o vuelva a ejecutar ANTIGAL para chequear  ║");
  205.          cprintf("║  una unidad de disco diferente a la actual. ║");
  206.          cprintf("╚═════════════════════════════════════════════╝");
  207.          window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  208.          cprintf("                                                  ");
  209.          gotoxy(24,23); cprintf("OK. Disco limpio.");
  210.          sleep(1); gotoxy(24,23);
  211.          cprintf("                                                  ");                 
  212.        }
  213.     pulsa=bioskey(0);
  214. tecl:    switch (pulsa)
  215.     {
  216.         case 283: fin();
  217.         default:  panta();
  218.               leeboot();
  219.               buscaenboot();
  220.     }    
  221. }
  222.  
  223. void leeboot(void)
  224. {
  225. short resultado1;
  226. int resultado2;
  227.  
  228. segmento=FP_SEG(buffer); despl=FP_OFF(buffer); 
  229. direcc=(char far *)MK_FP(segmento,despl+0x52);
  230.  
  231. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  232. cprintf("                                                  ");
  233. gotoxy(24,23); cprintf("Leyendo boot..."); sleep(1);
  234. gotoxy(24,23);
  235. cprintf("                                                  ");                 
  236.  
  237. asm     mov     ah,0
  238. asm     mov     dl,byte ptr unidad
  239. asm     int     13h
  240. resultado1=_AH;
  241.     if (resultado1 !=0) errorhand(resultado1);
  242.  
  243. asm    mov    ah,15h
  244. asm    mov    dl,byte ptr unidad
  245. asm    int    13h
  246. asm    mov    byte ptr cambio,ah
  247.  
  248. asm     mov     ah,2
  249. asm     mov     dl,byte ptr unidad
  250. asm     mov     dh,0
  251. asm     mov     ch,0
  252. asm     mov     cl,1
  253. asm     mov     al,1
  254. asm     mov     es,segmento
  255. asm     mov     bx,despl
  256. asm     int     13h
  257. asm     mov     resultado2,ax
  258.     if (unidad==0 && resultado2 !=0x0001) 
  259.         errorhand(resultado2);
  260.     else if (unidad==1 && resultado2 !=0x0001)
  261.         errorhand(resultado2);
  262.     else if (unidad==0x80 && resultado2!=0) 
  263.         errorhand(resultado2);
  264.     else if (unidad==0x81 && resultado2!=0)
  265.         errorhand(resultado2);
  266. }
  267.  
  268. void buscamem(void)
  269. {
  270. window(18,7,62,11);
  271. textattr(WHITE|BLUE<<4);
  272. cprintf("╔═══════════════════════════════════════════╗");
  273. cprintf("║  Atención: Buscando virus GALICIA en RAM. ║");
  274. cprintf("║         Analizando la memoria ....        ║");
  275. cprintf("╚═══════════════════════════════════════════╝");
  276. sleep(1);
  277. busca();
  278. }
  279.  
  280. void busca(void)
  281. {
  282. char far *cop;
  283. char dummy;
  284.  
  285. direcc=(int far *)MK_FP(0x0000,0x0413);
  286. segmento=*direcc*64; segmento-=0x07C0; despl=0x7C27;
  287. memo=(char far *)MK_FP(segmento,despl); 
  288. cop=(char far *)MK_FP(segmento,0x7C00);
  289. for (temp=0;temp<sizeof cadena;temp++)
  290.     {
  291.      if (*memo!=cadena[temp]) goto noresid;
  292.      else memo++;
  293.     }
  294. window(14,7,66,21); textattr(YELLOW|RED<<4); 
  295. putch(7); 
  296. cprintf("╔═══════════════════════════════════════════════════╗");
  297. cprintf("║      Atención: Virus GALICIA detectado en la      ║");
  298. cprintf("║         dirección de memoria : %X:7C00          ║",segmento);
  299. cprintf("╟───────────────────────────────────────────────────╢");
  300. cprintf("║                                                   ║");
  301. cprintf("║                                                   ║");
  302. cprintf("║                                                   ║");
  303. cprintf("║                                                   ║");
  304. cprintf("║                                                   ║");
  305. cprintf("║                                                   ║");
  306. cprintf("║                                                   ║");
  307. cprintf("║                                                   ║");
  308. cprintf("║                                                   ║");
  309. cprintf("╚═══════════════════════════════════════════════════╝");
  310. window(15,11,65,20); textattr(WHITE|RED<<4);
  311. for (temp=0;temp<459;temp++) 
  312. { dummy=*cop; if (dummy<32) dummy='.'; cprintf("%c",dummy); cop++; }            
  313. mensaje("¡ Virus encontrado en memoria !"); textattr(LIGHTGRAY|BLACK<<4);
  314. sleep(5); clrscr(); panta();
  315. window(17,7,63,15);
  316. cprintf("╔═════════════════════════════════════════════╗");
  317. cprintf("║  Aviso: El virus se encuentra en memoria.   ║");
  318. cprintf("║ Aunque el programa continuará su ejecucion, ║");
  319. cprintf("║  se recomienda arrancar con un disco limpio ║");
  320. cprintf("║        y ejecutar de nuevo ANTIGAL.         ║");
  321. cprintf("║                                             ║");
  322. cprintf("║                                             ║");
  323. cprintf("╚═════════════════════════════════════════════╝");
  324. window(23,13,62,13); textattr(YELLOW|BLUE<<4);
  325. cprintf("Analizando boot de unidad %c: .....",letra); sleep(1);
  326. leeboot(); buscaenboot();
  327. noresid:
  328. window(18,7,62,11);
  329. cprintf("╔═══════════════════════════════════════════╗");
  330. cprintf("║   OK !. No se encontró el virus en RAM.   ║");
  331. cprintf("║     Analizando boot de unidad %c: ....     ║",letra);
  332. cprintf("╚═══════════════════════════════════════════╝");
  333. }
  334.  
  335. void intro(void)
  336. {
  337. clrscr(); gotoxy(20,9); textattr(YELLOW|BLUE<<4);
  338. cprintf("╔═════════════════════════════════════╗\n"); gotoxy(20,10);
  339. cprintf("║               ANTIGAL               ║\n"); gotoxy(20,11);
  340. cprintf("║ (c) 1995  Por Javier Guerrero Diaz. ║\n"); gotoxy(20,12);
  341. cprintf("║ Rastrea el sector de arranque de la ║\n"); gotoxy(20,13);
  342. cprintf("║  unidad especificada como parámetro ║\n"); gotoxy(20,14);
  343. cprintf("║     en busca del virus GALICIA.     ║\n"); gotoxy(20,15);
  344. cprintf("╚═════════════════════════════════════╝\n");
  345. textattr(LIGHTGRAY|BLACK<<4);tecla=getch();
  346. clrscr();
  347. }
  348.  
  349. void fin(void)
  350. {
  351. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  352. cprintf("                                                  ");
  353. gotoxy(24,23); cprintf("PROGRAMA FINALIZADO.");
  354. _setcursortype(_NORMALCURSOR); textattr(LIGHTGRAY|BLACK<<4);
  355. gotoxy(24,1);
  356. exit(0);
  357. }
  358.  
  359. void mal(void)
  360. {
  361. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  362. cprintf("                                                  ");
  363. gotoxy(24,23); cprintf("PROGRAMA FINALIZADO ANORMALMENTE.");
  364. _setcursortype(_NORMALCURSOR); textattr(LIGHTGRAY|BLACK<<4);
  365. gotoxy(24,1);
  366. exit(-1);
  367. }
  368.  
  369. void errorhand(numerror)
  370. int numerror;
  371. {
  372.     switch(numerror)
  373.     {
  374.     case 0x0100:    mensaje("Error: Función no permitida.");
  375.                break;
  376.     case 0x0200:    mensaje("Error: Marca de direcciones no encontrada.");
  377.                    break;
  378.     case 0x0300:    mensaje("Error: Disquete protegido contra escritura.");
  379.                     break;
  380.     case 0x0400:    mensaje("Error: Sector no encontrado.");
  381.                break;
  382.     case 0x0600:
  383.                if (cambio!=2) 
  384.             { mensaje("Error: Disco retirado, pulsa tecla para repetir lectura.");
  385.                getch(); }
  386.                leeboot(); buscaenboot();
  387.                break;
  388.     case 0x0800:    mensaje("Error: Desbordamiento de DMA.");
  389.             break;
  390.     case 0x0900:    cprintf("Error: Superado el límite de 64k de segmento.");
  391.             break;
  392.     case 0x0c00:    mensaje("Error: Tipo de entorno no hallado.");
  393.                break;
  394.     case 0x1000:    mensaje("Error: Fallo de lectura.");
  395.             break;
  396.     case 0x2000:    mensaje("Error: Fallo de controladora de disco.");
  397.             break;
  398.     case 0x4000:    mensaje("Error: Pista no encontrada.");
  399.             break;
  400.     case 0x8000:    mensaje("Error: Time Out; unidad no responde.");
  401.                     break;
  402.     default:        mensaje("Error: Fallo general.");
  403.                 break;
  404.     }
  405. mal();
  406. }
  407.  
  408. void mensaje(mensa)
  409. char mensa[50];
  410. {
  411. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  412. cprintf("                                                  ");
  413. gotoxy(24,23); cprintf("%s",mensa); putch(7);
  414. sleep(1); gotoxy(24,23);
  415. cprintf("                                                  ");                 
  416. }
  417.  
  418. void panta(void)
  419. {
  420. window(20,2,60,7);
  421. gotoxy(1,1);
  422. textattr(YELLOW|BLUE<<4);
  423. cprintf("╔═══════════════════════════════════════╗");
  424. cprintf("║   ANTIGAL: DETECTOR DE VIRUS GALICIA  ║");
  425. cprintf("║     (C) Por Javier Guerrero Diaz      ║");
  426. cprintf("╚═══════════════════════════════════════╝");
  427. window(1,22,80,25);
  428. cprintf("╔══════════════════════════════════════════════════════════════════════════════╗");
  429. cprintf("║ RESULTADO OPERACION:                                                         ║");
  430. cprintf("╚══════════════════════════════════════════════════════════════════════════════╝");
  431. textattr(WHITE|BLUE<<4); window(1,1,80,25);
  432. }
  433.